#ifndef __FLASHBULB_OBJECT_HPP__
#define __FLASHBULB_OBJECT_HPP__

namespace flashbulb {

class Object  {
public:
    virtual ~Object();

    /**
     * @brief Virtual assignment operator.
     *
     * For details, see
     * <a href="http://code.google.com/p/flashbulb/wiki/AssignmentOperator">the
     * wiki</a>.
     */
    virtual Object& operator =(Object const& rhs) = 0;

    /**
     * @brief Allocates and returns a copy of this object.
     *
     * This function creates a copy of the object it is called on. It
     * is intended for use as a polymorphic copy constructor.
     *
     * @return A pointer to the newly-allocated copy. Unless otherwise
     * stated, you must delete the object yourself.
     */
    virtual Object* clone() const = 0;

    /**
     * @brief Compares two objects for equality.
     *
     * This operator is intended to allow direct comparisons for
     * equality between different flashbulb objects. Details are
     * available on
     * <a href="http://code.google.com/p/flashbulb/wiki/EqualityOperator">
     * the wiki</a>.
     *
     * @return @c true if the two objects are equal; @c false
     * otherwise
     */
    virtual bool operator ==(Object const& rhs) const = 0;

    /**
     * @brief Compares objects for inequality.
     *
     * @return the boolean NOT of the equality operator
     */
    bool operator !=(Object const& rhs) const;
};

}

#endif // __FLASHBULB_OBJECT_HPP__

